
using UnityEngine;

//用于表示背包系统中的一个物品槽位
[System.Serializable]
public class InventorySlot : ItemSlot
{
    // 构造函数，用于创建一个带有物品和堆叠数量的槽
    public InventorySlot(InventoryItemData source, int amount)
    {
        itemData = source;
        _itemID = itemData.ID;
        stackSize = amount;
    }

    // 默认构造函数，用于创建一个空槽
    public InventorySlot()
    {
        ClearSlot();
    }

    // 检查是否有足够的堆叠空间，并返回剩余的可堆叠数量
    public bool EnoughRoomLeftInStack(int amountToAdd, out int amountRemaining)
    {
        amountRemaining = itemData.MaxStackSize - stackSize; // 计算剩余的可堆叠数量
        return EnoughRoomLeftInStack(amountToAdd);
    }

    // 检查是否有足够的堆叠空间
    public bool EnoughRoomLeftInStack(int amountToAdd)
    {
        // 如果当前堆叠数量加上要添加的数量小于等于最大堆叠数量
        if (itemData == null || itemData != null && stackSize + amountToAdd <= itemData.MaxStackSize)
            return true;
        else
            return false;
    }

    //更新库存槽的数据
    public void UpdateInventorySlot(InventoryItemData data, int amount)
    {
        itemData = data;
        _itemID = itemData.ID;// 通过传入的物品数据获取物品ID
        stackSize = amount;
    }

    /// <summary>
    /// 将物品堆叠一分为二。
    /// </summary>
    /// <param name="splitStack">拆分后的新物品堆叠。</param>
    /// <returns>是否成功拆分。</returns>
    public bool SplitStack(out InventorySlot splitStack)
    {
        // 如果物品堆叠为空或堆叠数量小于1，则无法拆分
        if (stackSize < 1)
        {
            splitStack = null;
            return false;
        }

        // 计算需要拆分出的物品堆叠数量（约为原始堆叠数量的一半）
        int halfStack = Mathf.RoundToInt(stackSize / 2f);

        // 从原始堆叠中移除一部分物品
        RemoveFromStack(halfStack);

        // 创建一个新的物品堆叠作为拆分后的一半
        splitStack = new InventorySlot(itemData, halfStack);

        return true;
    }
}
